home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
-
- #define BOXMAX 13
- #define WIDTH 5
- #define HEIGHT 2
- #define LEFT (40-((BOXMAX * WIDTH) / 2))
-
- #define ESC 0x1b
-
- typedef (*fnptr) ();
-
- unsigned int box [BOXMAX][4];
-
- /***************************************************************************/
- param (limit)
- unsigned int limit;
- {
- if (limit >= 100)
- fputc ('0' + (limit / 100), stdout);
- if (limit >= 10)
- fputc ('0' + ((limit / 10) % 10), stdout);
- fputc ('0' + (limit % 10), stdout);
- }
- /***************************************************************************/
- crlf ()
- {
- fputc ('\r', stdout);
- fputc ('\n', stdout);
- }
- /***************************************************************************/
- eos ()
- {
- fputc (ESC, stdout);
- fputc ('[', stdout);
- fputc ('2', stdout);
- fputc ('J', stdout);
- }
- /***************************************************************************/
- home ()
- {
- fputc (ESC, stdout);
- fputc ('[', stdout);
- fputc ('H', stdout);
- }
- /***************************************************************************/
- clear ()
- {
- fputc (ESC, stdout);
- fputc ('[', stdout);
- fputc ('r', stdout);
- fputc (ESC, stdout);
- fputc ('[', stdout);
- param (40);
- fputc ('m', stdout);
- eos ();
- crlf ();
- }
- /***************************************************************************/
- sgr (index)
- {
- fputc (ESC, stdout);
- fputc ('[', stdout);
- param (41 + index % 3);
- fputc ('m', stdout);
- }
- /***************************************************************************/
- ssr (region)
- unsigned int region [4];
- {
- fputc (ESC, stdout);
- fputc ('[', stdout);
- param (region [0]);
- fputc (';', stdout);
- param (region [1]);
- fputc (';', stdout);
- param (region [2]);
- fputc (';', stdout);
- param (region [3]);
- fputc ('r', stdout);
- }
- /***************************************************************************/
- su (level)
- unsigned int level;
- {
- unsigned int region [4];
- int index;
-
- region [0] = box [level] [0] - HEIGHT;
- region [1] = box [level] [1];
- region [2] = box [level] [2];
- region [3] = box [level] [3];
- ssr (region);
- home ();
- sgr (level + 1);
- fputc (ESC, stdout);
- fputc ('[', stdout);
- param (HEIGHT);
- fputc ('S', stdout);
- for (index = level;
- index >= 0;
- index--)
- {
- box [index] [0] -= HEIGHT;
- box [index] [1] -= HEIGHT;
- }
- crlf ();
- }
- /***************************************************************************/
- sd (level)
- unsigned int level;
- {
- unsigned int region [4];
- int index;
-
- region [0] = box [level] [0];
- region [1] = box [level] [1] + HEIGHT;
- region [2] = box [level] [2];
- region [3] = box [level] [3];
- ssr (region);
- home ();
- sgr (level + 1);
- fputc (ESC, stdout);
- fputc ('[', stdout);
- param (HEIGHT);
- fputc ('T', stdout);
- for (index = level;
- index >= 0;
- index--)
- {
- box [index] [0] += HEIGHT;
- box [index] [1] += HEIGHT;
- }
- crlf ();
- }
- /***************************************************************************/
- sr (level)
- unsigned int level;
- {
- unsigned int region [4];
- int index;
-
- region [0] = box [level] [0];
- region [1] = box [level] [1];
- region [2] = box [level] [2];
- region [3] = box [level] [3] + WIDTH;
- ssr (region);
- home ();
- sgr (level + 1);
- fputc (ESC, stdout);
- fputc ('[', stdout);
- param (WIDTH);
- fputc (' ', stdout);
- fputc ('A', stdout);
- for (index = level;
- index >= 0;
- index--)
- {
- box [index] [2] += WIDTH;
- box [index] [3] += WIDTH;
- }
- if (region [1] - region [0])
- crlf ();
- }
- /***************************************************************************/
- sl (level)
- unsigned int level;
- {
- unsigned int region [4];
- int index;
-
- region [0] = box [level] [0];
- region [1] = box [level] [1];
- region [2] = box [level] [2] - WIDTH;
- region [3] = box [level] [3];
- ssr (region);
- home ();
- sgr (level + 1);
- fputc (ESC, stdout);
- fputc ('[', stdout);
- param (WIDTH);
- fputc (' ', stdout);
- fputc ('@', stdout);
- for (index = level;
- index >= 0;
- index--)
- {
- box [index] [2] -= WIDTH;
- box [index] [3] -= WIDTH;
- }
- if (region [1] - region [0])
- crlf ();
- }
- /***************************************************************************/
- fnptr sx [] =
- {&sr, &sd, &sl, &su};
- /***************************************************************************/
- scroll (level, way)
- unsigned int level;
- unsigned int way;
- {
- if (way)
- if (box [level] [0] == box [level + 1] [0])
- if (box [level] [2] == box [level + 1] [2])
- sr (level);
- else
- sd (level);
- else
- if (box [level] [2] == box [level + 1] [2])
- su (level);
- else
- sl (level);
- else
- if (box [level] [0] == box [level + 1] [0])
- if (box [level] [2] == box [level + 1] [2])
- sd (level);
- else
- sl (level);
- else
- if (box [level] [2] == box [level + 1] [2])
- sr (level);
- else
- su (level);
- }
- /***************************************************************************/
- paint ()
- {
- unsigned int index;
-
- clear ();
- for (index = 0;
- index < BOXMAX;
- index++)
- {
- box [index] [0] = 1;
- box [index] [1] = 1 + (HEIGHT * index);
- box [index] [2] = 1 + LEFT;
- box [index] [3] = 1 + (LEFT + (WIDTH * index));
- }
- for (index = BOXMAX;
- index-- > 0;
- )
- {
- ssr (box [index]);
- sgr (index);
- eos ();
- crlf ();
- }
- }
- /***************************************************************************/
- cycleclock ()
- {
- unsigned int level;
- unsigned int direction;
-
- paint ();
- for (level = 0;
- level < (BOXMAX - 1);
- ++level)
- for (direction = 0;
- direction < 4;
- ++direction)
- scroll (level, 1);
- }
- /***************************************************************************/
- cyclecounter ()
- {
- unsigned int level;
- unsigned int direction;
-
- paint ();
- for (level = 0;
- level < (BOXMAX - 1);
- ++level)
- for (direction = 4;
- direction-- > 0;
- )
- scroll (level, 0);
- }
- /***************************************************************************/
- cyclealternate ()
- {
- unsigned int level;
- unsigned int direction;
-
- paint ();
- for (level = 0;
- level < (BOXMAX - 1);
- ++level)
- for (direction = 0;
- direction < 4;
- ++direction)
- scroll (level, (level & 0x0001));
- }
- /***************************************************************************/
- stepclock ()
- {
- unsigned int level;
- unsigned int direction;
-
- paint ();
- for (direction = 0;
- direction < 4;
- ++direction)
- for (level = 0;
- level < (BOXMAX - 1);
- ++level)
- scroll (level, 1);
- }
- /***************************************************************************/
- stepcounter ()
- {
- unsigned int level;
- unsigned int direction;
-
- paint ();
- for (direction = 0;
- direction < 4;
- ++direction)
- for (level = 0;
- level < (BOXMAX - 1);
- ++level)
- scroll (level, 0);
- }
- /***************************************************************************/
- stepalternate ()
- {
- unsigned int level;
- unsigned int direction;
-
- paint ();
- for (direction = 0;
- direction < 4;
- ++direction)
- for (level = 0;
- level < (BOXMAX - 1);
- ++level)
- scroll (level, ((level + direction) & 0x0001));
- }
- /***************************************************************************/
- main ()
- {
- cycleclock ();
- cyclecounter ();
- cyclealternate ();
- stepclock ();
- stepcounter ();
- stepalternate ();
- clear ();
- }
- /***************************************************************************/